package com.lagou.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
import java.util.List;

/**
 * 编程实现服务器的初始化和关闭
 */
public class ServerInitClose extends Thread{
    /**
     * 自定义成员变量记录Socket和流对象
     */
    // 服务器大插排
    private ServerSocket ss/* = null*/;
    // 客户端，一个socket对应一个客户端
    private List<ServerComunicator> clientList;
    // 定义一个接口，用于 客户端自己断开时候，释放资源，从clientList中删除？

    @Override
    public void run() {
        boolean flag = true;
        while (flag) {
            // 2.等待客户端的连接请求，调用accetp方法
            System.out.println("等待客户端的连接请求...");
            Socket s = null;
            try {
                s = ss.accept();
            } catch (IOException e) {
                e.printStackTrace();
                flag = false;
            } finally {
                if (null != s) {
                    ServerComunicator serverComunicator = new ServerComunicator(s);
                    if (null != s) {
                        serverComunicator.start();
                        clientList.add(serverComunicator);
                    }
                }
            }

            System.out.println("客户端连接成功！");
        }
    }

    /**
     * 自定义成员方法实现服务器的初始化操作
     */
    // 高度内聚，低耦合
    public void serverInit() throws IOException {

        // 1.创建ServerSocket类型的对象并提供端口号
        ss = new ServerSocket(8888);
        clientList = new LinkedList<>();
        System.out.println("服务器初始化成功！");
    }

    /**
     * 自定义成员方法实现服务器的关闭操作
     */
    public void serverClose() throws IOException {
        // 4.关闭socket并释放有关的资源
        // 循环关闭所有的资源
        ss.close();
        System.out.println("服务器成功关闭");
    }

}
